package priv.yiyuan.example.design.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.Date;

/**
 * 性能监控和日志记录
 * <p>
 * 动态代理处理器
 *
 * @author YiYuan
 * @data 2025/9/24
 * @apoNote
 */
public class PerformanceLogInvocationHandler implements InvocationHandler {

    private Object target;

    public PerformanceLogInvocationHandler(Object target) {
        this.target = target;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

        long startTime = System.currentTimeMillis();

        System.out.println("\n--- 动态代理前置处理: 方法 " + method.getName() + "开始执行, 参数: " + Arrays.toString(args) + " ---");
        Object result = null;

        try {
            // 调用真实对象的方法
            result = method.invoke(target, args);

        } catch (Exception e) {

            System.out.println("动态代理异常处理: 方法 " + method.getName() + " 执行异常: " + e.getMessage());
            throw e.getCause();

        } finally {

            long endTime = System.currentTimeMillis();

            System.out.println("--- 动态代理后置处理: 方法 " + method.getName() + " 执行完毕, 耗时: " + (endTime - startTime) + " 毫秒 ---");
            System.out.println("操作日志: 方法 " + method.getName() + " 在 " + new Date() + " 被调用。");
        }

        return result;

    }
}
